package arraylist;

import java.util.Arrays;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 顺序表的实现
 */
@SuppressWarnings({"all"})
public class MyArrayList {
    public int[] elements;
    public int usedSize; // 存储有效数据的个数
    public static final int DEFAULT_SIZE = 5;

    public MyArrayList(){
        elements = new int[DEFAULT_SIZE];
        usedSize = 0;
    }

    // 遍历顺序表
    public void display(){
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elements[i] + " ");
        }
        System.out.println();
    }

    // 判断该顺序表中是否含有对应的元素
    public boolean contains(int key){
        for (int i = 0; i < usedSize; i++) {
            if (elements[i] == key){
                return true;
            }
        }
        return false;
    }

    // 返回对应元素的索引
    public int indexOf(int key){
        for (int i = 0; i < usedSize; i++) {
            if (elements[i] == key){
                return i;
            }
        }
        return -1;
    }

    // 判断顺序表是否已经满了
    public boolean isFull(){
        return elements.length == usedSize;
    }

    // 扩容
    public void resize(){
        this.elements = Arrays.copyOf(elements, 2 * usedSize);
    }

    // 添加元素, 添加顺序表末尾
    public void add(int data){
        if (isFull()){
            // 如果已经满了的情况下，需要进行扩容
            resize();
        }
        // 添加
        elements[usedSize] = data;
        usedSize++;
    }

    // 检查插入元素的时候，pos是否合法
    public void checkAddIndex(int pos){
        if (pos < 0 || pos > usedSize){
            throw new MyIndexOutOfException("add操作, pos位置不合法!");
        }
    }

    // 在指定pos位置添加元素
    public void add(int pos, int data){
        // 先检查pos是否越界
        checkAddIndex(pos);
        // 再判断是否需要扩容
        if (isFull()){
            resize();
        }
        // 指定位置添加 先将[pos, useSize-1] 位置的向后移动 再将 data 放到 pos 位置
        for (int i = usedSize-1; i >= pos ; i--) {
            elements[i+1] = elements[i];
        }
        elements[pos] = data;
        usedSize++;
    }

    // 检查获取元素的时候，pos是否合法
    public void checkIndex(int pos){
        if (pos < 0 || pos >= usedSize){
            throw new MyIndexOutOfException("pos位置不合法!");
        }
    }

    // 获取pos位置的值
    public int get(int pos){
        // 先判断合法性
        checkIndex(pos);
        // 返回
        return this.elements[pos];
    }

    // 更新pos位置的值
    public void set(int pos, int data){
        // 先判断合法性
        checkIndex(pos);
        this.elements[pos] = data;
    }

    // 删除pos位置的元素
    public void remove(int pos){
        // 先检查pos是否合法
        checkIndex(pos);
        // pos + 1开始覆盖
        for (int i = pos; i < usedSize - 1 ; i++) {
            elements[i] = elements[i+1];
        }
        usedSize--;
        elements[usedSize] = 0;
    }

    // 清空顺序表
    public void clear(){
        this.elements = new int[DEFAULT_SIZE];
        usedSize = 0;
    }

    // 获取长度
    public int size(){
        return usedSize;
    }
}
